﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Gerencial_Fisio_Nutry.Tela
{
    public partial class Venda : Form
    {
        #region variaveis
        public int codigoFuncionario;
        public string idFuncionario;
        public string nomeFuncionario;
        public Logica.Produto prod;
        public Logica.VendaObj venda;
        int position;
        #endregion variaveis
        public Venda()
        {
            InitializeComponent();

            codigoFuncionario = Variaveis.Variaveis.cod_Funcionario;
            Logica.Funcionario funcionario = new Logica.Funcionario(codigoFuncionario);
            venda = new Logica.VendaObj(funcionario);
            carregar(); limparTela(); tbCodigo.Focus();
        }
        public Logica.Pedido pedido;
        public Venda(Logica.Pedido pedido)
        {

            InitializeComponent();
            this.pedido = pedido;
            codigoFuncionario = this.pedido.funcionario.codFuncionario;
            Logica.Funcionario funcionario = new Logica.Funcionario(codigoFuncionario);
            venda = new Logica.VendaObj(funcionario, pedido);
            
            foreach(Logica.ItemDoPedido its in pedido.itens ){
              Logica.ItemObj item = new Logica.ItemObj();
              item.insereProduto(its);
              venda.inserirItem  (item);
            }
            carregar(); carregarListView(); limparTela(); tbCodigo.Focus(); 
            
        }
        public void inserirItens()
        {
            Logica.ItemObj item = new Logica.ItemObj();

            item.insereProduto(prod, prod.precoSaida, prod.quantidadeComprada, prod.descontoAplicado);
            venda.inserirItem(item);

            carregarListView();
            limparTela();
            tbCodigo.Focus();
        }
        public void carregar()
        {
            lData.Text += DateTime.Now.ToShortDateString();
            lHora.Text += DateTime.Now.ToShortTimeString();
           
            codigoFuncionario = Variaveis.Variaveis.cod_Funcionario;
            idFuncionario = Variaveis.Variaveis.idFuncionario;
            nomeFuncionario = Variaveis.Variaveis.nomeFuncionario;
            lbCaixa.Text = nomeFuncionario;

        }
        private void btAlterarCaixa_Click(object sender, EventArgs e)
        {
            AlterarCaixa ac = new AlterarCaixa();
            ac.ShowDialog();
            if (ac.alterou)
            {
                codigoFuncionario = ac.codFuncionario;
                idFuncionario = ac.idFuncionario;
                nomeFuncionario = ac.nomeFuncionario;
                lbCaixa.Text = nomeFuncionario;
            }
        }
        public bool temNaVenda(int codigo)
        {
            for (int i = 0; i < venda.itens.Count;i++ )
                if (venda.itens[i].produto.cod_Produto == codigo)
                    return true;
            return false;
        }
        public bool temNaVenda(string referencia)
        {
            for (int i = 0; i < venda.itens.Count; i++)
                if (venda.itens[i].produto.referencia == referencia)
                    return true;
            return false;
        }
        private void tbCodigo_KeyPress(object sender, KeyPressEventArgs e)
        {
           
            if(e.KeyChar==(13))
            {
                if (tbCodigo.Text.Length == 0) return;
                if (temNaVenda(int.Parse(tbCodigo.Text)))
                {
                    MessageBox.Show("Produto Já Consta na Venda", "Informação");
                    tbCodigo.Clear(); tbCodigo.Focus(); return;
                }
                Banco.MetodoBanco metodo = new Banco.MetodoBanco();

                for (int i = 0; i < tbCodigo.Text.Length; i++)
                    if (!char.IsNumber(tbCodigo.Text, i))
                    {
                        tbCodigo.Clear();
                        return;
                    }
                if (metodo.existeProduto(Convert.ToInt32(tbCodigo.Text)))
                {
                    prod = metodo.carregarProdutoByCodigo(Convert.ToInt32(tbCodigo.Text));
                    prod.quantidadeAtualEstoque = metodo.estoqueDoProduto(Convert.ToInt32(tbCodigo.Text));
                    if (prod.quantidadeAtualEstoque <= 0)
                        
                    {
                        limparTela();
                        tbCodigo.Focus();
                        MessageBox.Show("Produto informado não consta no Estoque");
                        return;
                    }
                    preencherProdutoNaTela(prod);
                    btInserirNaVenda.Enabled = true;
                }
            }
        }

        public void preencherProdutoNaTela(Logica.Produto produto)
        {
            tbCodigo.Text = produto.cod_Produto.ToString("0000");
            tbDescricao.Text = produto.descricao;
            tbReferencia.Text = produto.referencia;
            tbQuantidade.Text = produto.quantidadeComprada.ToString();
            Banco.MetodoBanco metodo = new Banco.MetodoBanco();
            tbSegmento.Text = metodo.carregaSegmento(produto.cod_Produto);
            tbValorUnit.Text = produto.precoSaida.ToString("0.00");
            tbDesconto.Text =  (produto.descontoAplicado*100)+"%";
            tbValorLiquido.Text = (produto.precoSaida - (produto.precoSaida * produto.descontoAplicado)).ToString("0.00");
        }
        private void tbReferencia_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (13))
            {
                if (tbReferencia.Text.Length == 0) return;
                if (temNaVenda(tbReferencia.Text))
                {
                    MessageBox.Show("Produto Já Consta na Venda", "Informação");
                    tbReferencia.Clear(); tbReferencia.Focus(); return;
                }
                Banco.MetodoBanco metodo = new Banco.MetodoBanco();

                for (int i = 0; i < tbReferencia.Text.Length; i++)
                    if (!char.IsNumber(tbReferencia.Text, i))
                    {
                        tbReferencia.Clear();
                        return;
                    }
                if (metodo.existeProduto(tbReferencia.Text))
                {
                    prod = metodo.carregarProdutoByReferencia(tbReferencia.Text);
                    prod.quantidadeAtualEstoque = metodo.estoqueDoProduto(prod.cod_Produto);
                    if (prod.quantidadeAtualEstoque <= 0)
                    {
                        limparTela();
                        tbReferencia.Focus();
                        MessageBox.Show("Produto informado não consta no Estoque");
                        return;
                    }
                    preencherProdutoNaTela(prod);
                    btInserirNaVenda.Enabled = true;
                }

            }
        }
        private void btQtdMais_Click(object sender, EventArgs e)
        {
            if ((prod.quantidadeComprada + 1) > prod.quantidadeAtualEstoque)
                return;

            prod.quantidadeComprada += 1;
            tbQuantidade.Text = prod.quantidadeComprada.ToString();
        }
        private void btQtdMenos_Click(object sender, EventArgs e)
        {

            if ((prod.quantidadeComprada - 1) > 0)
                prod.quantidadeComprada -= 1;
            tbQuantidade.Text = prod.quantidadeComprada.ToString();
        }
        public void limparTela()
        {
            btInserirNaVenda.Enabled = false;
            prod = new Logica.Produto();
            tbSegmento.Text = tbReferencia.Text = tbDescricao.Text = tbCodigo.Text = "";
            tbQuantidade.Text = "1";
            tbValorLiquido.Text = tbValorUnit.Text = ("0.00");
            tbDesconto.Text = "0%";
        }
        private void btInserirMesa_Click(object sender, EventArgs e)
        {
            Logica.ItemObj item = new Logica.ItemObj();

            item.insereProduto(prod,prod.precoSaida,prod.quantidadeComprada,prod.descontoAplicado);
            venda.inserirItem(item);
           
            carregarListView();
            limparTela();
            tbCodigo.Focus();
        }     
        public void limpaListView()
        {
            while (lvInfo.Columns.Count > 0)
                lvInfo.Columns.RemoveAt(0);
        }
        public void carregarListView()
        {
            lvInfo.Items.Clear();
            limpaListView();
           
            int j = 0;
            #region inserir Colunas
            lvInfo.Columns.Add(new ColumnHeader());
            lvInfo.Columns[j].Text = "Código";
            lvInfo.Columns[j++].Width = 72;
            lvInfo.Columns.Add(new ColumnHeader());
            lvInfo.Columns[j].Text = "Referencia";
            lvInfo.Columns[j++].Width = 132;
            lvInfo.Columns.Add(new ColumnHeader());
            lvInfo.Columns[j].Text = "Descrição";
            lvInfo.Columns[j++].Width = 252;
            lvInfo.Columns.Add(new ColumnHeader());
            lvInfo.Columns[j].Text = "Quantidade";
            lvInfo.Columns[j++].Width = 85;
            lvInfo.Columns.Add(new ColumnHeader());
            lvInfo.Columns[j].Text = "ValorUntitario";
            lvInfo.Columns[j++].Width = 89;
            lvInfo.Columns.Add(new ColumnHeader());
            lvInfo.Columns[j].Text = "Desconto";
            lvInfo.Columns[j++].Width = 79;
            lvInfo.Columns.Add(new ColumnHeader());
            lvInfo.Columns[j].Text = "Sub Total";
            lvInfo.Columns[j++].Width = 104;

            #endregion
            for (int i = 0; i < venda.itens.Count; i++)
            {
           
                 lvInfo.Items.Add(venda.itens[i].produto.cod_Produto.ToString("0000"));
                  lvInfo.Items[i].SubItems.Add(venda.itens[i].produto.referencia  );
                   lvInfo.Items[i].SubItems.Add(venda.itens[i].produto.descricao );
                   lvInfo.Items[i].SubItems.Add(venda.itens[i].produto.quantidadeComprada.ToString()  );
                   lvInfo.Items[i].SubItems.Add((venda.itens[i].precoSaida-(venda.itens[i].precoSaida * venda.itens[i].descontoAplicado)).ToString("0.00"));
                   lvInfo.Items[i].SubItems.Add((100* venda.itens[i].descontoAplicado).ToString()+"%" );
                   lvInfo.Items[i].SubItems.Add(venda.itens[i].precoGeral.ToString("0.00"));

            }
            lValor.Text = venda.valorTotal.ToString("0.00");

        }
        private void btDesconto_Click(object sender, EventArgs e)
        {
            Desconto desc =new Desconto(nomeFuncionario,prod);
            desc.ShowDialog();
            if(desc.sim)
            preencherProdutoNaTela(prod);
        }
        private void btPessoa_Click(object sender, EventArgs e)
        {
            if (venda.valorTotal <= 0)
                return;
            Pagamento pag = new Pagamento(venda);
            pag.ShowDialog();
            if (pag.encerrou) this.Close();
        }
        private void removerTodosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                for (int i = 0; i < venda.itens.Count; i++)
                    if (venda.itens[i].produto.cod_Produto == position)
                    {
                        venda.itens.RemoveAt(i);
                        limparTela(); carregarListView();
                        return;
                        
                    }
            }
            catch { }
        }
        private void removerUmToolStripMenuItem_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < venda.itens.Count; i++)
                if (venda.itens[i].produto.cod_Produto == position)
                {
                    Banco.MetodoBanco metodo = new Banco.MetodoBanco();
                    if (venda.itens[i].quantidadeItem == 1) { venda.itens.RemoveAt(i); return; }
                    Logica.ItemObj item = new Logica.ItemObj();
                    prod = metodo.carregarProdutoByCodigo(position);
                    prod.quantidadeComprada = venda.itens[i].quantidadeItem-1;
                    venda.itens.RemoveAt(i); 
                    prod.quantidadeAtualEstoque = metodo.estoqueDoProduto(position);
                   
                    item.insereProduto(prod, prod.precoSaida, prod.quantidadeComprada, prod.descontoAplicado);
                    venda.inserirItem(item);
                    limparTela(); carregarListView();
                    return;
                }
          
        }
        private void adicionarUmToolStripMenuItem_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < venda.itens.Count; i++)
                if (venda.itens[i].produto.cod_Produto == position)
                {
                    Banco.MetodoBanco metodo = new Banco.MetodoBanco();
                    if (venda.itens[i].produto.quantidadeAtualEstoque == venda.itens[i].quantidadeItem)
                    { MessageBox.Show("Estoque Insuficiente"); return; }
                    Logica.ItemObj item = new Logica.ItemObj();
                    prod = metodo.carregarProdutoByCodigo(position);
                    prod.quantidadeComprada = venda.itens[i].quantidadeItem + 1;
                    venda.itens.RemoveAt(i);
                    prod.quantidadeAtualEstoque = metodo.estoqueDoProduto(position);

                    item.insereProduto(prod, prod.precoSaida, prod.quantidadeComprada, prod.descontoAplicado);
                    venda.inserirItem(item);
                    limparTela(); carregarListView();
                    return;
                }
         

        }
        private void alterarDescontoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                position = int.Parse(lvInfo.FocusedItem.SubItems[0].Text);
                if (lvInfo.FocusedItem.Text == "") return;
            }
            catch { return; }
            for (int i = 0; i < venda.itens.Count; i++)
                if (venda.itens[i].produto.cod_Produto == position)
                {
                    Banco.MetodoBanco metodo = new Banco.MetodoBanco();
                 
                    Logica.ItemObj item = new Logica.ItemObj();


                    prod = metodo.carregarProdutoByCodigo(position);
                    prod.quantidadeComprada = venda.itens[i].produto.quantidadeComprada;
                    prod.quantidadeAtualEstoque = metodo.estoqueDoProduto(position);
                    
                    venda.itens.RemoveAt(i);
                 

                    Desconto desc = new Desconto(nomeFuncionario, prod);
                    desc.ShowDialog();

                    item.insereProduto(prod, prod.precoSaida, prod.quantidadeComprada, prod.descontoAplicado);
                    venda.inserirItem(item);
                    limparTela();
                    carregarListView();
                    return;
                }
           
        }          
        private void lvInfo_Click(object sender, EventArgs e)
        {
            position = int.Parse(lvInfo.FocusedItem.SubItems[0].Text);

        }
        private void btConsProd_Click(object sender, EventArgs e)
        {
           ConsultaProduto cons = new ConsultaProduto();
            cons.ShowDialog();
            if (cons.cod_produto == 0)
                return;
            tbCodigo.Text = cons.cod_produto.ToString();
            tbCodigo_KeyPress(sender,new KeyPressEventArgs('\r'));
        }

        private void btPedido_Click(object sender, EventArgs e)
        {
            Logica.Pedido pedido = new Logica.Pedido();
            

            pedido.cod_empresa = venda.cod_empresa;
          
            pedido.dataPedido = DateTime.Now;
            pedido.funcionario = venda.funcionario;
            pedido.pessoa = venda.pessoa;
            pedido.valorTotal = venda.valorTotal;
            

            foreach (Logica.ItemObj itemv in venda.itens)
            {
                Logica.ItemDoPedido itemP = new Logica.ItemDoPedido();
                itemP.produto = itemv.produto;
                itemP.precoGeral = itemv.precoGeral;
                itemP.precoSaida = itemv.precoSaida;
                itemP.descontoAplicado = itemv.descontoAplicado;
                itemP.cod_pedido = itemv.cod_venda;
                itemP.quantidadeItem = itemv.quantidadeItem;
                pedido.itens.Add(itemP);
               
                
                   
            }
            ProcuraPessoa find = new ProcuraPessoa();
            find.ShowDialog();
            pedido.pessoa = find.pessoa;

            if (pedido.pessoa.cod_pessoa == 0)
                return;
            new Banco.MetodoBanco().inserirPedido(pedido);
            this.Close();


        }



     
    }
}
